home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / mint / lib / mntlib44.zoo / mntlib / do_lock.c < prev    next >
C/C++ Source or Header  |  1994-03-01  |  982b  |  62 lines

  1. /*
  2.  * lockf(3) and flock(2) emulation for MiNT by Dave Gymer
  3.  * Placed in the public domain; do with me as you will!
  4.  */
  5.  
  6. #include <errno.h>
  7. #include <fcntl.h>
  8. #include <unistd.h>
  9. #include <mintbind.h>
  10. #include <file.h>
  11. #include "lib.h"
  12.  
  13. int
  14. _do_lock(fd, cmd, size, whence)
  15.     int fd;
  16.     int cmd;
  17.     long size;
  18.     int whence;
  19. {
  20.     struct flock lock;
  21.     int fcmd;
  22.     long r;
  23.     extern int __mint;
  24.  
  25.     if (!__mint) {
  26.         errno = -EINVAL;
  27.         return -1;
  28.     }
  29.     lock.l_whence = whence;
  30.     lock.l_start = 0;
  31.     lock.l_len = size;
  32.     switch (cmd) {
  33.         case F_ULOCK:
  34.             lock.l_type = F_UNLCK;
  35.             fcmd = F_SETLK;
  36.             break;
  37.         case F_TEST:
  38.             lock.l_type = F_WRLCK;
  39.             fcmd = F_GETLK;
  40.             break;
  41.         case F_TLOCK:
  42.             lock.l_type = F_WRLCK;
  43.             fcmd = F_SETLK;
  44.             break;
  45.         case F_LOCK:
  46.             lock.l_type = F_WRLCK;
  47.             if (__mint < 95)
  48.                 fcmd = F_SETLK;
  49.             else
  50.                 fcmd = F_SETLKW;
  51.             break;
  52.         default:
  53.             errno = -EINVAL;
  54.             return -1;
  55.     }
  56.     if ((r = Fcntl(fd, &lock, fcmd)) < 0) {
  57.         errno = (int) -r;
  58.         return -1;
  59.     }
  60.     return 0;
  61. }
  62.